/*
 * @Author: songliuyang
 * @Date: 2021-10-Th 06:38:29
 * @Last Modified by:   songlyyes@163.com
 * @Last Modified time: 2021-10-Th 06:38:29
 */

/**
 * 格式化时间
 * @param  {time} 时间
 * @param  {cFormat} 格式
 * @return {String} 字符串
 * @example formatTime('2018-1-29', '{y}/{m}/{d} {h}:{i}:{s}') // -> 2018/01/29 00:00:00
 */

export function formatTime (time, cFormat) {
  if (arguments.length === 0) return null
  if ((time + '').length === 10) {
    time = +time * 1000
  }

  var format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'; var date
  if (typeof time === 'object') {
    date = time
  } else {
    date = new Date(time)
  }

  var formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  var time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    var value = formatObj[key]
    if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

/**
 * 返回指定长度的月份集合
 *
 * @param  {time} 时间
 * @param  {len} 长度
 * @param  {direction} 方向：  1: 前几个月;  2: 后几个月;  3:前后几个月  默认 3
 * @return {Array} 数组
 *
 * @example   getMonths('2018-1-29', 6, 1)  // ->  ["2018-1", "2017-12", "2017-11", "2017-10", "2017-9", "2017-8", "2017-7"]
 */
export function getMonths (time, len, direction) {
  var mm = new Date(time).getMonth()
  var yy = new Date(time).getFullYear()
  var direction = isNaN(direction) ? 3 : direction
  var index = mm
  var cutMonth = function (index) {
    if (index <= len && index >= -len) {
      return direction === 1 ? formatPre(index).concat(cutMonth(++index))
        : direction === 2 ? formatNext(index).concat(cutMonth(++index)) : formatCurr(index).concat(cutMonth(++index))
    }
    return []
  }
  var formatNext = function (i) {
    var y = Math.floor(i / 12)
    var m = i % 12
    return [yy + y + '-' + (m + 1)]
  }
  var formatPre = function (i) {
    var y = Math.ceil(i / 12)
    var m = i % 12
    m = m === 0 ? 12 : m
    return [yy - y + '-' + (13 - m)]
  }
  var formatCurr = function (i) {
    var y = Math.floor(i / 12)
    var yNext = Math.ceil(i / 12)
    var m = i % 12
    var mNext = m === 0 ? 12 : m
    return [yy - yNext + '-' + (13 - mNext), yy + y + '-' + (m + 1)]
  }
  // 数组去重
  var unique = function (arr) {
    if (Array.hasOwnProperty('from')) {
      return Array.from(new Set(arr))
    } else {
      var n = {}; var r = []
      for (var i = 0; i < arr.length; i++) {
        if (!n[arr[i]]) {
          n[arr[i]] = true
          r.push(arr[i])
        }
      }
      return r
    }
  }
  return direction !== 3 ? cutMonth(index) : unique(cutMonth(index).sort(function (t1, t2) {
    return new Date(t1).getTime() - new Date(t2).getTime()
  }))
}

/**
 * 返回指定长度的天数集合
 *
 * @param  {time} 时间
 * @param  {len} 长度
 * @param  {direction} 方向： 1: 前几天;  2: 后几天;  3:前后几天  默认 3
 * @return {Array} 数组
 *
 * @example date.getDays('2018-1-29', 6) // -> ["2018-1-26", "2018-1-27", "2018-1-28", "2018-1-29", "2018-1-30", "2018-1-31", "2018-2-1"]
 */
export function getDays (time, len, diretion) {
  var tt = new Date(time)
  var getDay = function (day) {
    var t = new Date(time)
    t.setDate(t.getDate() + day)
    var m = t.getMonth() + 1
    return t.getFullYear() + '-' + m + '-' + t.getDate()
  }
  var arr = []
  if (diretion === 1) {
    for (var i = 1; i <= len; i++) {
      arr.unshift(getDay(-i))
    }
  } else if (diretion === 2) {
    for (var i = 1; i <= len; i++) {
      arr.push(getDay(i))
    }
  } else {
    for (var i = 1; i <= len; i++) {
      arr.unshift(getDay(-i))
    }
    arr.push(tt.getFullYear() + '-' + (tt.getMonth() + 1) + '-' + tt.getDate())
    for (var i = 1; i <= len; i++) {
      arr.push(getDay(i))
    }
  }
  return diretion === 1 ? arr.concat([tt.getFullYear() + '-' + (tt.getMonth() + 1) + '-' + tt.getDate()])
    : diretion === 2 ? [tt.getFullYear() + '-' + (tt.getMonth() + 1) + '-' + tt.getDate()].concat(arr) : arr
}

/**
 * @param  {s} 秒数
 * @return {String} 字符串
 * @example formatHMS(3610) // -> 1h0m10s
 */
export function formatHMS (s) {
  var str = ''
  if (s > 3600) {
    str = Math.floor(s / 3600) + 'h' + Math.floor(s % 3600 / 60) + 'm' + s % 60 + 's'
  } else if (s > 60) {
    str = Math.floor(s / 60) + 'm' + s % 60 + 's'
  } else {
    str = s % 60 + 's'
  }
  return str
}

/**
 * @name:
 * @message: 获取某月有多少天
 * @param {*} time
 * @return {*}
 */
export function getMonthOfDay (time) {
  var date = new Date(time)
  var year = date.getFullYear()
  var mouth = date.getMonth() + 1
  var days

  // 当月份为二月时，根据闰年还是非闰年判断天数
  if (mouth == 2) {
    days = (year % 4 == 0 && year % 100 == 0 && year % 400 == 0) || (year % 4 == 0 && year % 100 != 0) ? 28 : 29
  } else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
    // 月份为：1,3,5,7,8,10,12 时，为大月.则天数为31；
    days = 31
  } else {
    // 其他月份，天数为：30.
    days = 30
  }
  return days
}

/**
 * @name:
 * @message: 获取某年有多少天
 * @param {*} time
 * @return {*}
 */
export function getYearOfDay (time) {
  var firstDayYear = this.getFirstDayOfYear(time)
  var lastDayYear = this.getLastDayOfYear(time)
  var numSecond = (new Date(lastDayYear).getTime() - new Date(firstDayYear).getTime()) / 1000
  return Math.ceil(numSecond / (24 * 3600))
}

/* 获取某年的第一天 */
export function getFirstDayOfYear (time) {
  var year = new Date(time).getFullYear()
  return year + '-01-01 00:00:00'
}

/* 获取某年最后一天 */
export function getLastDayOfYear (time) {
  var year = new Date(time).getFullYear()
  var dateString = year + '-12-01 00:00:00'
  var endDay = this.getMonthOfDay(dateString)
  return year + '-12-' + endDay + ' 23:59:59'
}

/**
 * @name:
 * @message: 获取某个日期是当年中的第几天
 * @param {*} time
 * @return {*}
 */
export function getDayOfYear (time) {
  var firstDayYear = this.getFirstDayOfYear(time)
  var numSecond = (new Date(time).getTime() - new Date(firstDayYear).getTime()) / 1000
  return Math.ceil(numSecond / (24 * 3600))
}

/**
 * @name:
 * @message: 获取某个日期在这一年的第几周
 * @param {*} time
 * @return {*}
 */
export function getDayOfYearWeek (time) {
  var numdays = this.getDayOfYear(time)
  return Math.ceil(numdays / 7)
}

/**
 * @name:
 * @message: 获取某个日期在这一周的周几
 * @param {*} time
 * @type '周* | 星期*'
 * @return {*}  '周一'
 */
export function getDayOfWeek (time, type = '周') {
  const date = time && new Date(time) || new Date()
  let days = date.getDay()
  switch (days) {
    case 1:
      days = type + '一'
      break
    case 2:
      days = type + '二'
      break
    case 3:
      days = type + '三'
      break
    case 4:
      days = type + '四'
      break
    case 5:
      days = type + '五'
      break
    case 6:
      days = type + '六'
      break
    case 0:
      days = type + '日'
      break
  }
  return days
}
